home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / graphics / w_fonted.zip / FONTEDIT.CPP next >
C/C++ Source or Header  |  1994-02-01  |  5KB  |  239 lines

  1. #include <conio.h>
  2. #include <ctype.h>
  3. #include <dos.h>
  4. #include <mem.h>
  5. #include <stdio.h>
  6.  
  7. #define CHAR_WIDE   8
  8. #define CHAR_HIGH   8
  9. #define MAX_CHAR  256
  10.  
  11. #define CHAR_SIZE ((CHAR_HIGH * CHAR_WIDE) / 8)
  12.  
  13. #define CHAR_FILL 0xDB
  14.  
  15. // Global Variables
  16. unsigned char charmap[MAX_CHAR][CHAR_SIZE];
  17.  
  18.  
  19. // Function Prototypes
  20. void main(void);
  21. void init(void);
  22. int  load(char *fname);
  23. int  save(char *fname);
  24. void showchar(int curr_char, int xpos, int ypos);
  25.  
  26.  
  27. void
  28. init(void)
  29. {
  30.     memset(charmap, 0, (MAX_CHAR * CHAR_SIZE));
  31. }
  32.  
  33.  
  34. int
  35. load(char *fname)
  36. {
  37.     FILE *fp;
  38.     int i;
  39.  
  40.     fp = fopen(fname, "rb");
  41.  
  42.     for (i = 0; i < MAX_CHAR; i++) {
  43.         fread(&charmap[i][0], CHAR_SIZE, 1, fp);
  44.     }
  45.  
  46.     fclose(fp);
  47.  
  48.     return 1;
  49. }
  50.  
  51.  
  52. int
  53. save(char *fname)
  54. {
  55.     FILE *fp;
  56.     int i;
  57.  
  58.     fp = fopen(fname, "wb");
  59.  
  60.     for (i = 0; i < MAX_CHAR; i++) {
  61.         fwrite(&charmap[i][0], CHAR_SIZE, 1, fp);
  62.     }
  63.  
  64.     fclose(fp);
  65.  
  66.     return 1;
  67. }
  68.  
  69.  
  70. void
  71. main(void)
  72. {
  73.     unsigned char byte;
  74.     int temp, done, curr_char, xpos, ypos;
  75.  
  76.     clrscr();
  77.  
  78.     init();
  79.  
  80.     done = 0;
  81.     curr_char = 0;
  82.     xpos = 0;
  83.     ypos = 0;
  84.  
  85.     load("vga8x8.fnt");
  86.  
  87.     while (!done) {
  88.         showchar(curr_char, xpos, ypos);
  89.  
  90.         byte = toupper(getch());
  91.  
  92.         switch (byte) {
  93.             case 'I':
  94.                 init();
  95.                 break;
  96.  
  97.             case 'C':
  98.                 memset(charmap[curr_char], 0, CHAR_SIZE);
  99.                 break;
  100.  
  101.             case 'L':
  102.                 load("vga8x8.fnt");
  103.                 break;
  104.  
  105.             case 'S':
  106.                 save("vga8x8.fnt");
  107.                 break;
  108.  
  109.             case 'Q':
  110.                 done = 1;
  111.                 break;
  112.  
  113.             case ' ':
  114.                 temp = (ypos * CHAR_WIDE) + xpos;
  115.                 charmap[curr_char][temp / 8] ^= (0x01 << (temp % 8));
  116.                 break;
  117.  
  118.             case '>':
  119.                 curr_char = (curr_char + MAX_CHAR + 1) % MAX_CHAR;
  120.                 break;
  121.  
  122.             case '<':
  123.                 curr_char = (curr_char + MAX_CHAR - 1) % MAX_CHAR;
  124.                 break;
  125.  
  126.             case '7':
  127.                 xpos = (xpos + CHAR_WIDE - 1) % CHAR_WIDE;
  128.                 ypos = (ypos + CHAR_HIGH - 1) % CHAR_HIGH;
  129.                 break;
  130.  
  131.             case '8':
  132.                 ypos = (ypos + CHAR_HIGH - 1) % CHAR_HIGH;
  133.                 break;
  134.  
  135.             case '9':
  136.                 xpos = (xpos + CHAR_WIDE + 1) % CHAR_WIDE;
  137.                 ypos = (ypos + CHAR_HIGH - 1) % CHAR_HIGH;
  138.                 break;
  139.  
  140.             case '4':
  141.                 xpos = (xpos + CHAR_WIDE - 1) % CHAR_WIDE;
  142.                 break;
  143.  
  144.             case '6':
  145.                 xpos = (xpos + CHAR_WIDE + 1) % CHAR_WIDE;
  146.                 break;
  147.  
  148.             case '1':
  149.                 xpos = (xpos + CHAR_WIDE - 1) % CHAR_WIDE;
  150.                 ypos = (ypos + CHAR_HIGH + 1) % CHAR_HIGH;
  151.                 break;
  152.  
  153.             case '2':
  154.                 ypos = (ypos + CHAR_HIGH + 1) % CHAR_HIGH;
  155.                 break;
  156.  
  157.             case '3':
  158.                 xpos = (xpos + CHAR_WIDE + 1) % CHAR_WIDE;
  159.                 ypos = (ypos + CHAR_HIGH + 1) % CHAR_HIGH;
  160.                 break;
  161.         }
  162.     }
  163.  
  164.     clrscr();
  165. }
  166.  
  167.  
  168. void
  169. showchar(int curr_char, int xpos, int ypos)
  170. {
  171.     unsigned char far *screen;
  172.     unsigned char *bufptr;
  173.     int i, j, temp;
  174.  
  175.     FP_SEG(screen) = 0xB800;
  176.     FP_OFF(screen) = 0x0000;
  177.  
  178.     *screen++ = (curr_char / 100) + '0';
  179.     *screen++ = 0x0F;
  180.     *screen++ = ((curr_char % 100) / 10) + '0';
  181.     *screen++ = 0x0F;
  182.     *screen++ = (curr_char % 10) + '0';
  183.     *screen++ = 0x0F;
  184.  
  185.     screen += 4;
  186.  
  187.     *screen++ = curr_char;
  188.     *screen++ = 0x0F;
  189.  
  190.     FP_OFF(screen) = (160 * 3) + 8;
  191.  
  192.     for (i=0; i < (CHAR_WIDE + 1); i++) {
  193.         *screen++ = '-';
  194.         *screen++ = 0x02;
  195.         *screen++ = '-';
  196.         *screen++ = 0x02;
  197.     }
  198.  
  199.     for (i=0; i < CHAR_HIGH; i++) {
  200.         FP_OFF(screen) = (160 * (i + 4)) + 8;
  201.  
  202.         *screen++ = '|';
  203.         *screen++ = 0x02;
  204.  
  205.         for (j=0; j < CHAR_WIDE; j++) {
  206.             temp = (i * CHAR_WIDE) + j;
  207.  
  208.             if ( charmap[curr_char][temp / 8] & (0x01 << (temp % 8)) ) {
  209.                 *screen++ = CHAR_FILL;
  210.                 *screen++ = 0x0F;
  211.                 *screen++ = CHAR_FILL;
  212.                 *screen++ = 0x0F;
  213.             } else {
  214.                 *screen++ = ' ';
  215.                 *screen++ = 0x0F;
  216.                 *screen++ = ' ';
  217.                 *screen++ = 0x0F;
  218.             }
  219.         }
  220.  
  221.         *screen++ = '|';
  222.         *screen++ = 0x02;
  223.     }
  224.  
  225.     FP_OFF(screen) = (160 * (CHAR_HIGH + 4)) + 8;
  226.     for (i=0; i < (CHAR_WIDE + 1); i++) {
  227.         *screen++ = '-';
  228.         *screen++ = 0x02;
  229.         *screen++ = '-';
  230.         *screen++ = 0x02;
  231.     }
  232.  
  233.     FP_OFF(screen) = (160 * (ypos + 4)) + (xpos * 4) + 11;
  234.     *screen++ = 0x72;
  235.     screen++;
  236.     *screen++ = 0x72;
  237. }
  238.  
  239.